package com.operator.Activitys.activity;

import android.Manifest;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.ImageView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.flyco.tablayout.CommonTabLayout;
import com.flyco.tablayout.listener.CustomTabEntity;
import com.flyco.tablayout.listener.OnTabSelectListener;
import com.google.gson.Gson;
import com.maning.updatelibrary.InstallUtils;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.adapter.FragmentAdapter;
import com.operator.Activitys.bean.InspectUpdateBean;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.fragment.HomeFragment;
import com.operator.Activitys.fragment.MyFragment;
import com.operator.Activitys.fragment.PurchaseFragment;
import com.operator.Activitys.fragment.RechargeFragment;
import com.operator.Activitys.http.manager.HomeManager;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.FileUtils;
import com.operator.Activitys.utils.LogUtils;
import com.operator.Activitys.utils.StringUtils;
import com.operator.Activitys.utils.ToastUtils;
import com.operator.Activitys.view.entity.TabEntity;
import com.tbruyelle.rxpermissions2.Permission;
import com.tbruyelle.rxpermissions2.RxPermissions;
import com.yalantis.ucrop.UCrop;

import org.simple.eventbus.EventBus;
import org.simple.eventbus.Subscriber;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import io.reactivex.functions.Consumer;
import me.nereo.multi_image_selector.MultiImageSelectorActivity;


/**
 * 项目名称：金泽云 手机app
 * 类描述：项目主页面
 * 创建人：张飞祥
 * 创建时间：2018/4/27 14:29
 * 修改人：张飞祥
 * 修改时间：2018/4/27 14:29
 * 修改备注：
 */

public class MainActivity extends BaseActivity implements ViewPager.OnPageChangeListener {


    //切换布局
    ViewPager vpMain;
    //TabLayout
    CommonTabLayout tabMainLayout;
    //我的消息小红点
    ImageView ivMyRed;


    //内存中用户实体
    private User mACacheUser = null;
    //更新内容
    private String content = "";
    //初始化网络请求
    public HomeManager mApiManager;

    //底部导航栏文字
    private String[] mTitles = {"首页", "缴费充值", "卡号进货", "我的"};
    //底部导航栏 未选中显示图片
    private int[] mIconUnselectIds = {
            R.drawable.ic_main_home_unchecked,R.drawable.ic_main_recharge_unchecked,
            R.drawable.ic_main_purchase_unchecked,R.drawable.ic_main_my_unchecked};
    //底部导航栏 选中显示图片
    private int[] mIconSelectIds = {
            R.drawable.ic_main_home_checked,R.drawable.ic_main_recharge_checked,
            R.drawable.ic_main_purchase_checked,R.drawable.ic_main_my_checked};
    //底部导航栏数据装填 集合
    private ArrayList<CustomTabEntity> mTabEntities = new ArrayList<>();

    //fragment 集合
    private List<Fragment> fragments = new ArrayList<>();
    //fragment 适配器
    private FragmentAdapter fragmentAdapter;

    @Override
    protected void initUI() {
        setContentView(R.layout.act_main);
        //获取内存用户实体
        Gson gson = new Gson();
        mACacheUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "",User.class);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getHomeApiManager(this, this.getTaskId());

        //TODO 初始化视图
        initViews();
    }

    /**
     * 初始化视图
     */
    private void initViews() {
        //APP检查更新 网络请求
        mApiManager.inspectUpdateApp(Constant.APP_TYPE);
        //滑动视图
        vpMain = findViewById(R.id.vp_main);
        //TabLayout
        tabMainLayout = findViewById(R.id.tab_main_layout);
        //我的消息小红点
        ivMyRed = findViewById(R.id.iv_my_red);
    }

    @Override
    protected void initData() {
        //adapter 加载 fragment 具体 操作
        initAddFragmentToViewPager();

        //TODO  初始化 TabLayout 设置
        //循环装填数据
        for (int i = 0; i < mTitles.length; i++) {
            mTabEntities.add(new TabEntity(mTitles[i], mIconSelectIds[i], mIconUnselectIds[i]));
        }
        //将数据 放到 TabLayout 控件上
        tabMainLayout.setTabData(mTabEntities);

        //底部 TabLayout 点击事件
        initTabItemClick();

        //TODO 配置相应的权限
        requestPermissions();
    }


    /**
     * 初始化 适配器数据
     */
    private void initAddFragmentToViewPager() {
        //添加 Fragment
        fragments.add(new HomeFragment());          //首页
        fragments.add(new RechargeFragment());      //缴费充值
        fragments.add(new PurchaseFragment());      //卡号进货
        fragments.add(new MyFragment());            //我的

        //fragment 适配器
        fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(), fragments);
        // 配置适配器
        vpMain.setAdapter(fragmentAdapter);
        //滑动事件监听
        vpMain.setOnPageChangeListener(this);
    }

    /**
     * 底部 TabLayout 点击事件
     */
    private void initTabItemClick() {
        tabMainLayout.setOnTabSelectListener(new OnTabSelectListener() {
            @Override
            public void onTabSelect(int position) {
                //将 ViewPager 滑动到相应的位置
                vpMain.setCurrentItem(position);
            }
            @Override
            public void onTabReselect(int position) {
            }
        });
    }



    /**
     * 权限申请
     */
    private void requestPermissions() {
        RxPermissions rxPermission = new RxPermissions(MainActivity.this);

        rxPermission.requestEach(
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA)
                .subscribe(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission permission) throws Exception {
                        if (permission.granted) {
                            // 用户已经同意该权限
                            LogUtils.d(permission.name + " is granted.");
                        } else if (permission.shouldShowRequestPermissionRationale) {
                            // 用户拒绝了该权限，没有选中『不再询问』（Never ask again）,那么下次再次启动时，还会提示请求权限的对话框
                            LogUtils.d(permission.name + " is denied. More info should be provided.");
                        } else {
                            // 用户拒绝了该权限，并且选中『不再询问』
                            LogUtils.d(permission.name + " is denied. More info should be provided.");
                        }
                    }
                });
    }


    /**
     * viewPager 滑动事件
     * @param position
     * @param positionOffset
     * @param positionOffsetPixels
     */
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }
    @Override
    public void onPageSelected(int position) {
        //将 TabLayout 设置到相应的位置
        tabMainLayout.setCurrentTab(position);
    }
    @Override
    public void onPageScrollStateChanged(int state) {
    }

    /**
     * 屏蔽 Back 键
     */
    @Override
    public void onBackPressed() {
//        super.onBackPressed();
    }

    /**
     * 极光推送 更新余额信息
     */
    @Subscriber(tag = Constant.BUS_MY_REMAINDER)
    public void onJpushShopMoneyPush(double JPushMoney) {
        //设置最新 余额数据
        mACacheUser.setRemainder(JPushMoney);
    }

    /**
     * 接收 退出页面消息
     */
    @Subscriber(tag = Constant.BUS_EXIT_MAIN)
    public void onExitMainUI(String exit) {
        finish();
    }

    /**
     * 首次加载 APP 检查更新接口
     */
    @Subscriber(tag = Constant.BUS_APP_UPDATE)
    public void onInspectUpdateApp(final InspectUpdateBean bean) {
        if (bean!=null){
            //获取 本地 版本号
            int versionCode = FileUtils.getLocalVersion(this);
            //获取 本地 版本名称
            String versionName = FileUtils.getLocalVersionName(this);

            //TODO 将实体类保存 到本地
            mACache.put(Constant.CACHE_APP_UPDATE, new Gson().toJson(bean));
            //获取更新内容
            content = StringUtils.isStrIntercept(bean.getRemark(),"。");
            /**
             * 业务逻辑判
             */
            if (bean.getVersionCode()>versionCode){
                //显示 我的消息小红点
                ivMyRed.setVisibility(View.VISIBLE);
                //TODO 判断 当前是否需要强制更新
                if ((bean.getVersionCode()-versionCode)>5){
                    //开始强制更新
                    setShowForceDialog(bean);
                }
            }else{
                //隐藏 我的消息小红点
                ivMyRed.setVisibility(View.GONE);
            }
        }
    }

    /**
     * 显示提示dialog
     */
    public void initShowMsgDialog(String title,String content,int color) {
        //提示 dialog
        MaterialDialog mMsgDialog = new MaterialDialog.Builder(this)
                .title(title)
                .titleColor(color)
                .content(content)
                .positiveText("好，我知道了")
                .positiveColor(color)
                .show();
        // 设置点击屏幕Dialog不消失
        mMsgDialog.setCanceledOnTouchOutside(false);
        //取消Back键监听
        mMsgDialog.setCancelable(false);
    }

    /**
     * 开启强制更新 弹窗
     * @param bean
     */
    private void setShowForceDialog(final InspectUpdateBean bean){
        final MaterialDialog updateApkMsg = new MaterialDialog.Builder(this)
                .title("版本过低")
                .titleColor(Color.parseColor("#EC5B5B"))
                .content("新版本：v "+bean.getVersion()+"\n       由于您版本过低，为了不影响您正常使用，请您及时更新！本次更新内容如下：\n\n"+content)
                .positiveText("立即更新")
                .positiveColor(Color.parseColor("#EC5B5B"))
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {

                        //开启进度条
                        final MaterialDialog progress = new MaterialDialog.Builder(MainActivity.this)
                                .title("版本升级")
                                .content("正在下载安装包，请稍候...")
                                .progress(false, 100, false)
                                .cancelable(false)
                                .show();

                        //执行开始新下载 最新版本APK
                        InstallUtils.with(MainActivity.this)
                                //必须-下载地址
                                .setApkUrl(bean.getDownLoadUrl())
                                //非必须，默认update
                                .setApkName("update")
                                //非必须-下载回调
                                .setCallBack(new InstallUtils.DownloadCallBack() {
                                    @Override
                                    public void onStart() {
                                        //TODO 设置开始下载进度
                                        progress.setProgress(0);
                                    }

                                    @Override
                                    public void onComplete(String path) {
                                        //销毁弹窗
                                        progress.dismiss();
                                        /**
                                         * 安装APK工具类
                                         * @param context       上下文
                                         * @param filePath      文件路径
                                         * @param callBack      安装界面成功调起的回调
                                         */
                                        InstallUtils.installAPK(MainActivity.this, path, new InstallUtils.InstallCallBack() {
                                            @Override
                                            public void onSuccess() {
                                            }

                                            @Override
                                            public void onFail(Exception e) {
                                                ToastUtils.showShort(MainActivity.this,"安装失败！");
                                            }
                                        });
                                    }

                                    @Override
                                    public void onLoading(long total, long current) {
                                        //下载中
                                        //TODO 配置 正在下载任务栏 参数信息
                                        progress.setProgress((int) (current * 100 / total));
                                        LogUtils.i("downLoadAPK:------------>已下载 "+(current * 100 / total)+" %");
                                    }

                                    @Override
                                    public void onFail(Exception e) {
                                        //销毁弹窗
                                        progress.dismiss();
                                        //下载失败
                                        ToastUtils.showShort(MainActivity.this,"本次下载失败，请重试！");
                                    }

                                    @Override
                                    public void cancel() {
                                        //下载取消
                                    }
                                })
                                //开始下载
                                .startDownload();
                    }
                }).show();
        // 设置点击屏幕Dialog不消失
        updateApkMsg.setCanceledOnTouchOutside(false);
        //取消Back键监听
        updateApkMsg.setCancelable(false);
    }

    /**
     * 图片 选择 裁剪 回调 方法
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        //TODO 选择图片
        if (requestCode == Constant.REQUEST_IMAGE && resultCode == RESULT_OK) {

            //TODO 获取当前图片路径 转成 URi的形式
            List<String> path = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);

            //TODO 传递到图片裁剪器
            //需要裁剪的图片路径
            Uri sourceUri = Uri.fromFile(new File(path.get(0)));
            //裁剪完毕的图片存放路径
            Uri destinationUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "ic_user_url.jpg"));

            //TODO 创建 裁剪参数
            UCrop uCrop = UCrop.of(sourceUri, destinationUri);
            UCrop.Options options = new UCrop.Options();
            //裁剪 比例
            uCrop.withAspectRatio(1, 1);
            //是否能调整裁剪框
            options.setFreeStyleCropEnabled(true);
            //标题栏颜色
            options.setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary));
            //设置状态栏颜色
            options.setStatusBarColor(ActivityCompat.getColor(this, R.color.colorPrimaryDark));
            //标题栏 按钮颜色
            options.setToolbarWidgetColor(ContextCompat.getColor(this, R.color.color_bg_white));
            //底部控件 按钮颜色
            options.setActiveWidgetColor(ContextCompat.getColor(this, R.color.color_bg_blue));
            //圆形裁剪
            options.setCircleDimmedLayer(true);
            //添加 裁剪参数
            uCrop.withOptions(options);

            //TODO 跳转裁剪页面
            uCrop.start(this);
        }

        //TODO 裁剪后的图片
        if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
            //获取 裁剪后 图片的 Uri
            Uri resultUri = UCrop.getOutput(data);
            //发送 消息 裁剪后的uri 到 MyFragment
            EventBus.getDefault().post(resultUri,Constant.BUS_RECEIVE_MY_URI);
        }
        //TODO 裁剪图片 出错
        else if (resultCode == UCrop.RESULT_ERROR) {
            final Throwable cropError = UCrop.getError(data);
            ToastUtils.showShort(this,"图片裁剪时出错！可能当前设备不支持裁剪！");
        }
    }
}
